// Copyright Epic Games, Inc. All Rights Reserved.

#include "LyraTeamInfoBase.h"

#include "Engine/World.h"
#include "Net/UnrealNetwork.h"
#include "Teams/LyraTeamSubsystem.h"

#include UE_INLINE_GENERATED_CPP_BY_NAME(LyraTeamInfoBase)

class FLifetimeProperty;

/**
 * 构造函数
 */
ALyraTeamInfoBase::ALyraTeamInfoBase(const FObjectInitializer& ObjectInitializer)
	: Super(ObjectInitializer)
	, TeamId(INDEX_NONE) // 初始化团队ID为无
{
	bReplicates = true; // 设置可复制
	bAlwaysRelevant = true; // 设置始终相关
	NetPriority = 3.0f; // 设置网络优先级
	SetReplicatingMovement(false); // 设置不复制移动
}

/**
 * 获取生命周期复制属性
 */
void ALyraTeamInfoBase::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const
{
	Super::GetLifetimeReplicatedProps(OutLifetimeProps); // 调用父类方法

	DOREPLIFETIME(ThisClass, TeamTags); // 复制团队标签
	DOREPLIFETIME_CONDITION(ThisClass, TeamId, COND_InitialOnly); // 条件复制团队ID（仅初始）
}

/**
 * 开始播放
 */
void ALyraTeamInfoBase::BeginPlay()
{
	Super::BeginPlay(); // 调用父类开始播放

	TryRegisterWithTeamSubsystem(); // 尝试注册到团队子系统
}

/**
 * 结束播放
 */
void ALyraTeamInfoBase::EndPlay(const EEndPlayReason::Type EndPlayReason)
{
	if (TeamId != INDEX_NONE) // 如果团队ID有效
	{
		ULyraTeamSubsystem* TeamSubsystem = GetWorld()->GetSubsystem<ULyraTeamSubsystem>(); // 获取团队子系统
		if (TeamSubsystem) // 如果团队子系统有效
		{
			// EndPlay可能在子系统已被销毁的奇怪时间发生
			TeamSubsystem->UnregisterTeamInfo(this); // 取消注册团队信息
		}
	}

	Super::EndPlay(EndPlayReason); // 调用父类结束播放
}

/**
 * 注册到团队子系统
 */
void ALyraTeamInfoBase::RegisterWithTeamSubsystem(ULyraTeamSubsystem* Subsystem)
{
	Subsystem->RegisterTeamInfo(this); // 注册团队信息
}

/**
 * 尝试注册到团队子系统
 */
void ALyraTeamInfoBase::TryRegisterWithTeamSubsystem()
{
	if (TeamId != INDEX_NONE) // 如果团队ID有效
	{
		ULyraTeamSubsystem* TeamSubsystem = GetWorld()->GetSubsystem<ULyraTeamSubsystem>(); // 获取团队子系统
		if (ensure(TeamSubsystem)) // 确保团队子系统有效
		{
			RegisterWithTeamSubsystem(TeamSubsystem); // 注册到团队子系统
		}
	}
}

/**
 * 设置团队ID
 */
void ALyraTeamInfoBase::SetTeamId(int32 NewTeamId)
{
	check(HasAuthority()); // 检查是否有权限
	check(TeamId == INDEX_NONE); // 检查当前团队ID为无
	check(NewTeamId != INDEX_NONE); // 检查新团队ID有效

	TeamId = NewTeamId; // 设置团队ID

	TryRegisterWithTeamSubsystem(); // 尝试注册到团队子系统
}

/**
 * 当团队ID复制时调用
 */
void ALyraTeamInfoBase::OnRep_TeamId()
{
	TryRegisterWithTeamSubsystem(); // 尝试注册到团队子系统
}